/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Persistencia;

import Message.Mensaje;
import SwConfMessage.Interfaz.IArchivo;
import java.io.*;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.ListIterator;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import mailserver.MailServer1;

/**
 *
 * @author Marisol
 */
public class Archivo<T> implements IArchivo<T> {

    /**
     * variable file para guardar el archivo 
     */
     
    File file;

    
    /**
     * Constructor de la Clase
     * @throws Exception 
     */
    public Archivo() throws Exception {
//        leerDatos();
        file = null;
    }

    /**
     * Funcion que obtiene objetos de datos 
     * @param name 
     * @return objetos de datos
     * @throws Exception 
     */
//    public Object leerDatos(String name) throws Exception {
//        Object data = null;
//
//        File file = new File(new File("").getAbsolutePath() + File.separator + name + ".bo");
//
//        if (file.exists()) {
////           
//            FileInputStream fileInputStream1 = new FileInputStream(file);
//            ObjectInputStream objectInputStream1 = new ObjectInputStream(fileInputStream1);
//            data = objectInputStream1.readObject();
////           
//
//            objectInputStream1.close();
//            fileInputStream1.close();
//        }
//
//        return (data);
//    }

//    public void guardarDatos(String name, Object data) throws Exception {
//
//        File file = new File(new File("").getAbsolutePath() + File.separator + name + ".bo");
//        if (file.exists()) {
//            FileOutputStream fileOutputStream = new FileOutputStream(file);
//            ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
//            objectOutputStream.writeObject(data);
//            objectOutputStream.close();
//            fileOutputStream.close();
//        } else {
//
//            FileWriter escribir = new FileWriter(file, true);
//            escribir.close();
//            guardarDatos(name, data);
//        }
//
//    }

//    public boolean existe(String nameArchivo) {
//
//        File file = new File(new File("").getAbsolutePath() + File.separator + nameArchivo + ".bo");
//
//        return file.exists();
//
//    }
   
    /**
     * Metodo que guarda objetos de datos 
     * @param objeto a guardar
     * @param Pach direccion donde se encuentra el archivo, 
     * @param nombreArchivo, donde se guardara los datos objetos
     * @param extension, del archivo 
     * @throws Exception 
     */
    @Override
    public void guardar(T objeto, String Pach, String nombreArchivo, String extension) throws Exception {

        file = new File(Pach + File.separator + nombreArchivo + "." + extension);
        if (file.exists()) {

            FileOutputStream fileOutputStream = new FileOutputStream(file);
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
            objectOutputStream.writeObject(objeto);
            objectOutputStream.close();
            fileOutputStream.close();
            file = null;
            return;
        }

        FileWriter escribir = new FileWriter(file, true);
        escribir.close();
        file = null;
        guardar(objeto, Pach, nombreArchivo, extension);

    }
    /**
     * Metodo que guarda el mensaje en la direccion que le corresponda
     * @param dato , informacion del mensaje
     * @param direccion, del archivo donde se almacenara el mensaje
     */
    public void guardarMensaje(T dato, String direccion) {
        FileWriter escribir = null;
        try {
            file = new File(direccion);
            escribir = new FileWriter(file, true);
            escribir.write((String) dato);
            escribir.close();
            file = null;

        } catch (IOException ex) {
            Logger.getLogger(Archivo.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                escribir.close();
            } catch (IOException ex) {
                Logger.getLogger(Archivo.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
    /**
     * Funcion que recupera el archivo de datos
     * @param Pach, direccion donde se encuentra dicho archivo
     * @param nombreArchivo, nombre del archivo a recuperar
     * @param extension, del archivo
     * @return el archivo solicitado
     * @throws Exception 
     */
    @Override
    public T recuperar(String Pach, String nombreArchivo, String extension) throws Exception {
        T data = null;

        file = new File(Pach + File.separator + nombreArchivo + "." + extension);

        if (file.exists()) {
//           
            FileInputStream fileInputStream1 = new FileInputStream(file);
            ObjectInputStream objectInputStream1 = new ObjectInputStream(fileInputStream1);
            data = (T) objectInputStream1.readObject();
//           

            objectInputStream1.close();
            fileInputStream1.close();
            file = null;
        }

        return (data);
    }
    /**
     * Function que devuelve verdadero si existe el archivo
     * @param Pach, direccion del archivo
     * @param nombreArchivo del archivo
     * @param extension del archivo
     * @return verdadero o falso
     * @throws Exception 
     */
    @Override
    public boolean existe(String Pach, String nombreArchivo, String extension) throws Exception {
        file = new File(Pach + File.separator + nombreArchivo + "." + extension);
        boolean exist;
        exist = file.exists();
        file = null;
        return exist;
    }
    
//     public static void main(String[] args) {
//        // TODO code application logic here
//
//        File file = new File(new File("").getAbsolutePath() + File.separator + "adriana.bo");
//
//
//
//    }

}
